//package com.ruoyi.chat.service.impl;
//
//import com.google.gson.JsonObject;
//import com.google.gson.JsonParser;
//import com.ruoyi.chat.domain.ChatRecords;
//import com.ruoyi.chat.mapper.DeepSeekMapper;
//import com.ruoyi.chat.service.DeepSeekService;
//import dev.langchain4j.model.chat.request.ChatRequest;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.stereotype.Service;
//import org.springframework.web.reactive.function.client.WebClient;
//import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
//
//import java.io.IOException;
//import java.io.InputStream;
//import java.util.HashMap;
//import java.util.Map;
//import java.util.Properties;
//
///**
// * @author WaKy
// * @version 1.0
// * DeepSeek R1 模型服务类
// */
//@Service
//@Slf4j
//public class DeepSeekServiceForR1 implements DeepSeekService {
//
//    private final DeepSeekMapper deepSeekMapper;
//    // 构造方法注入WebClient
//    private final WebClient webClient;
//
//    // 常量全部大写，_下划线分隔
//    // 定义API_KEY
//    private static final String API_KEY_DEEP_SEEK;
//
//    // 定义API_KEY和API_URL
//    private static final String BASE_URL_DEEP_SEEK;
//
//    // 使用Properties加载配置文件，读取key和url
//    // 如果报错，很可能是没有正确获取到API_KEY
//    static {
//        try {
//            Properties properties = new Properties();
//            // 读取类路径下的config.properties文件
//            InputStream is = DeepSeekClient.class.getResourceAsStream("/config.properties");
//            properties.load(is);
//            API_KEY_DEEP_SEEK = properties.getProperty("API_KEY_DEEP_SEEK");
//            BASE_URL_DEEP_SEEK = properties.getProperty("BASE_URL_DEEP_SEEK");
//        } catch (IOException e) {
//            throw new RuntimeException(e);
//        }
//    }
//
//
//    public DeepSeekServiceForR1(WebClient.Builder webClientBuilder, DeepSeekMapper deepSeekMapper) {
//        this.webClient = webClientBuilder.build();
//        this.deepSeekMapper = deepSeekMapper;
//    }
//
//
//    /**
//     * 处理聊天流式请求的服务方法。
//     * 该方法接收一个聊天请求，通过SSE（Server-Sent Events）将流式响应发送回客户端。
//     *
//     * @param request 聊天请求对象，包含用户发送的消息列表。
//     * @param emitter SSE发射器，用于将流式数据发送回客户端。
//     */
//    public void chatStreamService(ChatRequest request, SseEmitter emitter, Long recordId) {
//        // 构建请求体，包含模型名称、流式标志和消息列表
//        Map<String, Object> requestBody = new HashMap<>();
//        requestBody.put("model", "deepseek-reasoner");
//        requestBody.put("stream", true);
//        //requestBody.put("messages", request.getMessages());
//        // 解析出content
//        // StringBuilder,用于拼接AI响应的内容
//        StringBuilder sb = new StringBuilder();
//        // 使用WebClient发送POST请求到指定的模型服务URL
//        webClient.post()
//                .uri(BASE_URL_DEEP_SEEK)  // 设置请求的URL
//                .header("Content-Type", "application/json")  // 设置请求头为JSON格式
//                .header("Authorization", "Bearer " + API_KEY_DEEP_SEEK)  // 设置授权头
//                .bodyValue(requestBody)  // 设置请求体
//                .retrieve()
//                .bodyToFlux(String.class)  // 将响应体转换为Flux<String>
//                .subscribe(
//                        data -> {
//                            try {
//                                // 处理SSE结束标志
//                                if ("[DONE]".equals(data)) {
//                                    return;
//                                }
//                                // 检查数据是否为有效的JSON格式
//                                if (data.startsWith("{") && data.endsWith("}")) {
//                                    JsonObject jsonObject = JsonParser.parseString(data).getAsJsonObject();
//                                    JsonObject firstChoice =
//                                            jsonObject.getAsJsonArray("choices").get(0).getAsJsonObject();
//                                    JsonObject delta = firstChoice.getAsJsonObject("delta");
//
//                                    // 解析content
//                                    if (delta.has("content") && !delta.get("content").isJsonNull()) {
//                                        String content = delta.get("content").getAsString();
//                                        if (content != null) {
//                                            log.info("content:{}", content);
//                                            sb.append(content);
//                                            emitter.send(SseEmitter.event().data(content));
//                                        }
//                                    }
//
//                                    if (delta.has("reasoning_content") && !delta.get("reasoning_content").isJsonNull()) {
//                                        String reasoningContent = delta.get("reasoning_content").getAsString();
//                                        if (reasoningContent != null) {
//                                            log.info("reasoning_content:{}", reasoningContent);
//                                            sb.append(reasoningContent);
//                                            // 简化思维链格式
//                                            String formattedReasoning = reasoningContent.replace("\n", "\n  ");
//                                            log.info("formattedReasoning:{}", formattedReasoning);
//                                            emitter.send(SseEmitter.event().data(formattedReasoning));
//                                        }
//                                    }
//                                }
//                            } catch (Exception e) {
//                                // 如果发送过程中发生异常，则完成SSE并传递异常
//                                emitter.completeWithError(e);
//                            }
//                        },
//                        emitter::completeWithError,  // 如果发生错误，完成SSE并传递错误
//                        () -> {
//                            // 当流式响应完成时，完成SSE并打印sb的内容
//                            emitter.complete();
//                            //saveAiResponse(sb.toString(), recordId);
//                        }  // 当流式响应完成时，完成SSE
//                );
//    }
//
//    public Long saveUserQuestion(String content) {
//        ChatRecords chatRecords = new ChatRecords();
//        chatRecords.setUserQuestion(content);
//        deepSeekMapper.saveUserQuestion(chatRecords);
//        return chatRecords.getId();
//    }
//
//    public void saveAiResponse(String response, Long recordId) {
//        System.out.println("DeepSeekService.saveAiResponse");
//        deepSeekMapper.saveAiResponse(response, recordId);
//    }
//}
//
